/*
 * Título: gestHora. Aplicación web de gestión de horarios para conservatorios.
 * Alumnos:
 * - Javier Pardo Muñoz. I.T. Informática de Gestión
 * - Antonio Prior Cazorla. I.T. Informática de Gestión
 * Director: Dr. José Raúl Romero Salguero.
 *     
 *  Copyright (C) 2013 Javier Pardo Muñoz / Antonio Prior Cazorla
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.

 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package es.uco.gesthora.business;

import com.google.gson.Gson;
import es.uco.gesthora.data.DAO.DAOHorario;
import java.util.Vector;

/**
 * Maneja la capa lógica de todo lo relacionado con los horarios
 *
 * @author Javier Pardo Muñoz / Antonio Prior Cazorla
 *
 */
public class Horario {

    private static Horario instance = new Horario();
    private DAOHorario dHorario = null;

    /**
     * Constructor por defecto de la clase
     */
    private Horario() {
        dHorario = DAOHorario.getInstance();
    }

    /**
     * Devuelve una instancia de la clase usando el patrón Singleton
     *
     * @return Instancia de la clase Horarios
     */
    public static Horario getInstance() {
        return instance;
    }

    /**
     * Realiza las operaciones lógicas necesarias para borrar un horario
     *
     * @param idHorario: identificador del los horarios a borrar
     * @param idGrupo: identificador del grupo
     * @return true si ha funcionado correctamente / false si hay un error
     */
    public boolean borrar(int idHorario, int idGrupo) {
        int iresultado = 0;
        try {
            iresultado = dHorario.eliminar(idHorario, idGrupo);
        } catch (Exception e) {
        }

        //si iresultado es distinto a 0 entonces todo ha ido bien y devuelvo true
        if (iresultado != 0) {
            return true;
            //devuelvo un false si ha habido algun fallo    
        } else {
            return false;
        }
    }

    /**
     * Realiza las operaciones lógicas necesarias para insertar un nuevo horario
     *
     * @param idGrupo: identificador del grupo
     * @param idDia: identificador del dia
     * @param idHora: identificador de la hora
     * @param idHorario: identificador del horario
     * @return true si ha funcionado correctamente / false si hay un error
     */
    public boolean insertar(int idGrupo, int idDia, int idHora, int duracion) {
        int iresultado = 0;
        Vector v = new Vector();
        Vector aux = new Vector();

        try {
            aux = dHorario.seleccionar(idDia, idHora, idGrupo);
            if (aux.isEmpty()) {
                aux = dHorario.seleccionarHorarioProfesor(idGrupo, idDia, idHora, duracion);
                if (aux.isEmpty()) {
                    iresultado = dHorario.anadir(idGrupo, idDia, idHora, duracion);
                }
            }

        } catch (Exception e) {
        }

        //si iresultado es distinto a 0 entonces todo ha ido bien y devuelvo true
        if (iresultado != 0) {
            return true;
            //devuelvo un false si ha habido algun fallo    
        } else {
            return false;
        }
    }

    /**
     * Realiza las operaciones lógicas necesarias para insertar un nuevo horario
     *
     * @param idGrupo: identificador del grupo
     * @param idHorario: identificador de la horario
     * @param duracion: identificador de duracion
     * @return true si ha funcionado correctamente / false si hay un error
     */
    public boolean insertar(int idGrupo, int idHorario) {
        int iresultado = 0;
        Vector aux = new Vector();
        try {
           /* aux = dHorario.seleccionarHorario(idHorario);
            if (!aux.isEmpty()) {
                aux = dHorario.seleccionarHorarioGrupo(idGrupo, idHorario);
                if (aux.isEmpty()) {*/
                    iresultado = dHorario.anadir(idGrupo, idHorario);
                /*}
            }*/
        } catch (Exception e) {
        }
        //si iresultado es distinto a 0 entonces todo ha ido bien y devuelvo true
        if (iresultado != 0) {
            return true;
            //devuelvo un false si ha habido algun fallo    
        } else {
            return false;
        }
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para modificar la
     * información de un horario del sistema.
     *
     * @param idGrupo: identificador del grupo
     * @param idHorario: identificador del horario
     * @param idHora: identificador de la hora
     * @param idDia: identificador del dia
     * @param duracion: duración de la clase
     * @return true si ha funcionado correctamente / false si hay un error
     */
    public boolean modificar(int idGrupo, int idHorario, int idHora, int idDia, int duracion) {
        int iresultado = 0;
        Vector aux = null;

        try {
            // Se comprueba si la nueva información de la asignatura existe o no.
            aux = dHorario.seleccionar(idDia, idHora, idGrupo);
            if (aux.isEmpty()) {

                //aux = dHorario.seleccionarHorarioProfesor(idGrupo, idDia, idHora, duracion);
               // if (aux.isEmpty()) {
                    //Se modifica la información de la nueva asignatura.
                    iresultado = dHorario.modificar(idDia, idHora, idGrupo, idHorario, duracion);
               // }
            }
        } catch (Exception e) {
        }

        //si iresultado es distinto a 0 entonces todo ha ido bien y devuelvo true
        if (iresultado != 0) {
            return true;
            //devuelvo un false si ha habido algun fallo    
        } else {
            return false;
        }

    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos los
     * dias del sistema
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarDia() {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarDia();

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }

        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar todas las
     * horas del sistema
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHora() {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHora();

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos los
     * horarios de una grupo del sistema
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarios(int id) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarios(id);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de una especialidad
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioEspecialidad(int id) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioEspecialidad(id);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }

        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de una especialidad y un curso
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioEspecialidadCurso(String nombreUsuario, int idCurso) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioEspecialidadCurso(nombreUsuario, idCurso);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }

        return resultado;
    }

    
      /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de una especialidad y un curso
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioEspecialidadCurso(int idEspecialidad, int idCurso) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioEspecialidadCurso(idEspecialidad, idCurso);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }

        return resultado;
    }
    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de una especialidad, un curso y una asignatura
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioEspecialidadCursoAsignatura(String nombreUsuario, int idCurso, int idAsignatura) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioEspecialidadCursoAsignatura(nombreUsuario, idCurso, idAsignatura);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }

        return resultado;
    }

    
        /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de una especialidad, un curso y una asignatura
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioEspecialidadCursoAsignatura(int idAsignatura) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioEspecialidadCursoAsignatura( idAsignatura);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }

        return resultado;
    }
    
    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de un profesor
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioProfesor(int id) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioProfesor(id);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de un profesor mediante su nombre de usuario
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioProfesor(String usuario) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioProfesor(usuario);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar todos el
     * horario de un alumno mediante su nombre de usuario
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorarioAlumno(String usuario) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorarioAlumno(usuario);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar de horarios
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarHorario(int id) {
        Vector listado = null;
        String resultado = "";

        //Se realiza el listado de las asignaturas.
        listado = dHorario.seleccionarHorario(id);

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para listar los grupos
     * de una asignatura.
     *
     * @return cadena con formato JSON que contiene todos los asignaturas del
     * sistema
     */
    public String ListarGrupo(String id) {
        Vector listado = null;
        String resultado = "";

        listado = dHorario.seleccionarGrupo(Integer.parseInt(id));

        if (!listado.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(listado);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }

    /**
     * Realiza todas las operaciones lógicas necesarias para buscar una horario
     *
     * @param id: id del asignatura que se quiere buscar
     * @return cadena con formato JSON que contiene la información del
     * asignatura
     */
    public String buscar(int id) {
        String resultado = null;
        Vector horario = null;

        horario = dHorario.seleccionar(id);

        if (!horario.isEmpty()) {
            Gson json = new Gson();
            resultado = json.toJson(horario);
        } else {
            resultado = "Vacio";
        }
        return resultado;
    }
}